package org.alex.nettychat.netty.custom.handler;


import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.alex.nettychat.netty.custom.protocol.MessageRequestPacket;
import org.alex.nettychat.netty.custom.protocol.MessageResponsePacket;
import org.alex.nettychat.netty.custom.session.Session;
import org.alex.nettychat.netty.custom.utils.SessionUtil;

import java.time.LocalDateTime;

/**
 * SimpleChannelInboundHandler的使用非常简单。
 * 我们在继承这个类的时候，给它传递一个泛型参数，然后在channelRead0()方法里，
 * 不用再通过if逻辑来判断当前对象是否是本Handler可以处理的对象，也不用强转，
 * 不用往下传递本Handler处理不了的对象，这一切都已经交给父类SimpleChannelInboundHandler来实现，
 * 我们只需要专注于我们要处理的业务逻辑即可。
 *
 * @author : alex
 */
public class MessageRequestHandler extends SimpleChannelInboundHandler<MessageRequestPacket> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MessageRequestPacket messageRequestPacket) throws Exception {
        System.out.println(LocalDateTime.now() + ":收到客户端消息->" + messageRequestPacket.getMessage());

        // 1 获取消息发送方的会话消息
        Session session = SessionUtil.getSession(ctx.channel());

        // 2 通过发送方Session构造 发方响应信息
        MessageResponsePacket messageResponsePacket = new MessageResponsePacket();
        messageResponsePacket.setFromUserId(session.getUserId());
        messageResponsePacket.setFromUserName(session.getUserName());
        messageResponsePacket.setMessage(messageRequestPacket.getMessage());

        // 3 获取接收方的Channel
        Channel channel = SessionUtil.getChannel(messageRequestPacket.getToUserId());

        // 4 发送消息给消息接收方
        if (channel != null && SessionUtil.hasLogin(channel)) {
            channel.writeAndFlush(messageResponsePacket);
        } else {
            System.err.println("[" + messageRequestPacket.getToUserId() + "]不在线，发送失败");
        }
    }
}
